<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 1、⽤(    )⽅法来判断⼀个对象的数据类型,用(   )去判断是不是数组
            // 
            // 

        // 2、Js获取原型的方法有（） （） （）


        // 3、this在js中指的（）
            // 执行上下文的环境对象

        // 4、（）方法可以判断一个对象是否属于某个类即构造函数
            // instanceof   检测实例是否来自于某个构造函数
            // var arr = new Array(1,2,3);    // arr变量是数组实例对象    Array() 构造函数
            // var date = new Date();         // date变量是日期实例对象   Date()  构造函数
            // console.log( arr instanceof Array )    // true
            // console.log( date instanceof Date )    // true
            // console.log( date instanceof Array )   // false

        // var name = 'window'   
        // var person = {
        //     name: 'person',
        //     sayName: function () {
        //         console.log(this.name)
        //     }
        // }
        // function sayName () {
        //     // 局部
        //     var sss = person.sayName;    //  var sss = function() { console.log(this.name) } 
        //     sss();                 // window 
        //     person.sayName();      // person 
        //     (person.sayName)();    // person 与上一致 ()是迷惑行为  其实还是直接调用 
        //     (b = person.sayName)() // window 把函数赋值给b变量  而b是全局变量[因为没有var声明]  即 window.b()
        // }
        // sayName()

        // 以上代码 运行的结果是（）（）（）（）为什么（）

        // var name = 'window'
        // var person1 = {
        //     name: 'person1',
        //     foo1: function () {
        //         console.log(this.name)
        //     },
        //     foo2: () => {
        //         console.log(this.name)
        //     },
        //     foo3: function () {
        //         return function () {
        //             console.log(this.name)
        //         }
        //     },
        //     foo4: function () {
        //         return () => {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var person2 = { name: 'person2' }
        // // 正题来咯
        // person1.foo1();    
        // //  foo1 是普通函数  person1直接调用  this指向person1  即 person1.name  ->  person1
        // person1.foo1.call(person2); 
        // // foo1 是普通函数 执行foo1时 call修改了指向为person2且执行了函数 -> person2.name  -> person2
        // person1.foo2(); 
        // //  foo2 是箭头函数  -> 箭头没有this -> 不能修改this -> 出现了指向父级挂靠的环境对象
        // //  此时的this挂靠父级person1的环境  person1时全局变量  即 window    window.name
        // person1.foo2.call(person2);   //  看上一题   window
        // person1.foo3()();
        // // foo3是普通函数 执行后返回一个函数  全局接收  且执行  window.name
        // person1.foo3.call(person2)(); 
        // // foo3是普通函数 执行时修改了指向person2后   返回一个函数  全局接收  且执行  window.name
        // person1.foo3().call(person2);
        // // foo3是普通函数 执行后返回一个函数  全局接收 但是在执行时 修改了指向person2  即 window -> person2  
        // person1.foo4()();
        // // foo4 时普通函数  返回一个箭头函数  箭头没有this 查看父级挂靠->foo4    person1
        // person1.foo4.call(person2)();
        // // foo4 时普通函数  执行时修改了指向person2 返回一个箭头函数  箭头没有this 查看父级挂靠->foo4    person2
        // person1.foo4().call(person2);
        // // foo4 时普通函数  返回一个箭头函数  箭头没有this  即不能修改  person1
        // // 以上执行结果分别是（）（）（）（）（）（）（）（）（）（）为什么（）


        // var name = 'window'
        // function Person (name) {
        //     this.name = name
        //     this.foo1 = function () {
        //         console.log(this.name)
        //     }
        //     this.foo2 = () => console.log(this.name)
        //     this.foo3 = function () {
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        //     this.foo4 = function () {
        //         return () => { console.log(this.name) }
        //     }
        // }
        // var person1 = new Person('person1')
        // var person2 = new Person('person2')

        // person1.foo1() 
        // person1.foo1.call(person2) 
        // person1.foo2() 
        // person1.foo2.call(person2) 
        // person1.foo3()() 
        // person1.foo3.call(person2)() 
        // person1.foo3().call(person2) 
        // person1.foo4()()
        // person1.foo4.call(person2)() 
        // person1.foo4().call(person2) 
        // 以上执行结果是（）（）（）（）（）（）（）（）（）（） 为什么（）
        // var name = 'window'
        // function Person(name) {
        // this.name = name
        // this.obj = {
        //     name: 'obj',
        //     foo1: function () {
        //     return function () {
        //         console.log(this.name)
        //     }
        //     },
        //     foo2: function () {
        //     return () => {
        //         console.log(this.name)
        //     }
        //     }
        // }
        // }

        // var person1 = new Person('person1')
        // var person2 = new Person('person2')

        // person1.obj.foo1()()
        // person1.obj.foo1.call(person2)()
        // person1.obj.foo1().call(person2)

        // person1.obj.foo2()()
        // person1.obj.foo2.call(person2)()
        // person1.obj.foo2().call(person2)
        // 以上执行结果是（）（）（）（）（）（） 为什么（）
        // function Foo(){
        //     getName=function(){
        //         console.log(1);
        //     }
        //     return this
        // }

        // Foo.getName=function(){
        //     console.log(2);
        // }

        // Foo.prototype.getName = function() {
        //     // body...
        //     console.log(3);
        // };

        // var getName = function(){
        //     console.log(4);
        // }

        // function getName(){
        //     console.log(5);
        // }

        // Foo.getName();
        // getName();
        // Foo().getName();
        // getName();
        // new Foo.getName();
        // new Foo().getName();
        // new new Foo().getName();
        // 以上执行结果是（）（）（）（）（）（）（） 为什么（）

        // 二、简答题
        // 1、说出this的指向有什么？ 如何修改this指向？区别是什么？
        // 2、New操作符具体干了什么事儿？
        // 3、简单阐述构造函数 原型对象 实例对象三者的关系？

    </script>
</body>
</html>